package com.leetcode.code;

/**
 * Description:
 * 给定两个以字符串形式表示的非负整数 num1 和 num2，返回 num1 和 num2 的乘积，它们的乘积也表示为字符串形式。
 *
 * 示例 1:
 *
 * 输入: num1 = "2", num2 = "3"
 * 输出: "6"
 * 示例 2:
 *
 * 输入: num1 = "123", num2 = "456"
 * 输出: "56088"
 * 说明：
 *
 * num1 和 num2 的长度小于110。
 * num1 和 num2 只包含数字 0-9。
 * num1 和 num2 均不以零开头，除非是数字 0 本身。
 * 不能使用任何标准库的大数类型（比如 BigInteger）或直接将输入转换为整数来处理。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/multiply-strings
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author zkingcobra
 * Date: 2019/10/25 2:35 下午
 */
public class LeetCode0043Java {
    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.multiply("123", "22"));
    }

    //static class Solution {
    //    /**
    //     * 计算形式
    //     * num1
    //     * x num2
    //     * ------
    //     * result
    //     */
    //    public String multiply(String num1, String num2) {
    //        if ("0".equals(num1) || "0".equals(num2)) {
    //            return "0";
    //        }
    //        // 保存计算结果
    //        String res = "0";
    //
    //        // num2 逐位与 num1 相乘
    //        for (int i = num2.length() - 1; i >= 0; i--) {
    //            int carry = 0;
    //            // 保存 num2 第i位数字与 num1 相乘的结果
    //            StringBuilder temp = new StringBuilder();
    //            // 补 0
    //            for (int j = 0; j < num2.length() - 1 - i; j++) {
    //                temp.append(0);
    //            }
    //            int n2 = num2.charAt(i) - '0';
    //
    //            // num2 的第 i 位数字 n2 与 num1 相乘
    //            for (int j = num1.length() - 1; j >= 0 || carry != 0; j--) {
    //                int n1 = j < 0 ? 0 : num1.charAt(j) - '0';
    //                int product = (n1 * n2 + carry) % 10;
    //                temp.append(product);
    //                carry = (n1 * n2 + carry) / 10;
    //            }
    //            // 将当前结果与新计算的结果求和作为新的结果
    //            res = addStrings(res, temp.reverse().toString());
    //        }
    //        return res;
    //    }
    //
    //    /**
    //     * 对两个字符串数字进行相加，返回字符串形式的和
    //     */
    //    public String addStrings(String num1, String num2) {
    //        StringBuilder builder = new StringBuilder();
    //        int carry = 0;
    //        for (int i = num1.length() - 1, j = num2.length() - 1; i >= 0 || j >= 0 || carry != 0; i--, j--) {
    //            int x = i < 0 ? 0 : num1.charAt(i) - '0';
    //            int y = j < 0 ? 0 : num2.charAt(j) - '0';
    //            int sum = (x + y + carry) % 10;
    //            builder.append(sum);
    //            carry = (x + y + carry) / 10;
    //        }
    //        return builder.reverse().toString();
    //    }
    //}

    static class Solution {
        public String multiply(String num1, String num2) {
            char[] num1Char = num1.toCharArray();
            char[] num2Char = num2.toCharArray();
            int[] value = new int[num1.length() + num2.length()];

            for (int i = 0; i < num1Char.length; i++) {
                for (int j = 0; j < num2Char.length; j++) {
                    value[i + j + 1] += (num1Char[i] - '0') * (num2Char[j] - '0');
                }
            }

            int a = 0;
            for (int i = value.length - 1; i >= 0; i--) {
                value[i] += a;
                a = value[i] / 10;
                value[i] = value[i] % 10;
            }
            int b = 0;
            while (b < value.length - 1 && value[b] == 0) {
                b++;
            }
            StringBuilder sb = new StringBuilder();
            for (int i = b; i < value.length; i++) {
                sb.append(value[i]);
            }

            return sb.toString();
        }
    }
}
